var chess = document.getElementById('chess'); var context = chess.getContext('2d');//这两句就不解释了。
var chessBoard = newArray();//定义一个数组(这里是二维的),用于保存每个位置的落子情况。 for (var i = 0; i < 15; i++) { chessBoard[i] = []; for (var j = 0; j < 15; j++) { chessBoard[i][j] = 0;//初始化,将棋盘所有落子位置都设置成0。 } } //这里的canvas大小是450x450,棋盘按线划分规格是15+14*30+15,drawChessBoard()就完成了棋盘网格的绘制。 functiondrawChessBoard(){ for (var i = 0; i < 15; i++) { context.moveTo(15+ i * 30,15); context.lineTo(15+ i * 30,435); context.moveTo(15,15+ i * 30); context.lineTo(435,15+ i * 30); } context.lineWidth = 2; context.strokeStyle = "#ACACAC"; context.stroke(); }
②开始绘制棋子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
var me = "true" functiononeStep(i,j,me){ context.beginPath(); context.arc(15+ i * 30,15+ j * 30,13,0,2*Math.PI); context.closePath(); var gradient = context.createRadialGradient(15+ i * 30,15+ j * 30,0,15+ i * 30,15+ j * 30,13);//这里设置的是由前一个圆到后一个圆的渐变 if (me) { gradient.addColorStop(0,'#636766'); gradient.addColorStop(1,'#0a0a0a');//该if语句表示如果是人操作,绘制成黑色,并且实现由半径为0的白色到半径为13的黑色的圆的渐变色。 } else{ gradient.addColorStop(0,'#F9F9F9'); gradient.addColorStop(1,'#d1d1d1');//此外表示计算机操作,颜色设置同上。 } context.fillStyle = gradient; context.fill(); }
③绘制棋盘上的背景图片:
1 2 3 4 5 6
var logo = new Image(); logo.src = "map.png"; logo.onload = function(){ context.drawImage(logo,50,150,353,148);//50,150表示图片绘制的起始坐标 drawChessBoard();//注意,绘制棋盘的函数要在添加背景图片之后调用,否则背景图片会遮盖住线条。 }
var over =false; //点击棋盘,触发该函数 chess.onclick = function(e){//注意,这里的e在下文中表示的是onclick事件。 if (over) { return; } if (!me) { return; } // offsetX和offsetY这两个方法,是用于取得鼠标点击的位置 var x = e.offsetX; var y = e.offsetY; var i = Math.floor(x/30); var j = Math.floor(y/30); if (chessBoard[i][j] == 0) {//如果落子点没有已经存在的棋子 oneStep(i,j,me);//调用绘制棋子函数 chessBoard[i][j] = 1;//绘制完成后,将该处的位置标记为了,这样以后别的棋子就不会对该点进行覆盖了。 //下面的涉及到的是AI函数调用部分,可以先忽略,先看后面。 for(var k=0;k<count;k++){ if (wins[i][j][k]) { myWin[k]++; comWin[k] = 6; if (myWin[k] == 5) { window.alert("你赢了!"); over = true; } } } if (!over) { me = !me;//将下棋权限交给计算机 comAI();//调用下方的赢法统计,注意读到该部分,记得和这里结合来读 } } }